iT邦幫忙

2024 iThome 鐵人賽

DAY 2
0
Kubernetes

Kubernetes圖解筆記系列 第 2

Day-2 在學習 Kubernetes 之前 - Docker(1)

  • 分享至 

  • xImage
  •  

說到容器化就不能不提的貨櫃鯨魚 ╮(´∀`=)


道理我都懂,但到底要怎麼做容器化?

工具很多,但最常見也最廣泛使用的方式就是透過 Docker。
不管認不認識, 資訊人或多或少都看過這隻鯨魚:
https://ithelp.ithome.com.tw/upload/images/20240903/20168437gAyKvXVOcf.png

Docker,一套開源後促使容器化技術迅速發展的軟體專案。
原先是 dotCloud 公司(後來改名為 Docker Inc)的內部專案。一開始,只是為了滿足公司業務需求而開發,沒想到自從 2013 年將 Docker 專案開源後,這套輕量且好上手的工具得到了大量技術人員為其貢獻原始碼,使得這套容器工具得以迅速發展起來。

Docker 包括三個基本概念:映像檔(Image)、容器(Container)、倉庫(Repository

  • 映像檔(Image)
    唯讀,用來建立 Docker Container 的模板,包含了應用程式的所有配置和依賴。
  • 容器(Container)
    使用 image 來執行應用。
    (雖說映像檔是唯讀的,但container在啟動時會建立一層可寫層作為最上層)
  • 倉庫(Repository)
    用來存放 image 的位置/空間,分為公開(public)和私有(private),最大的公開倉庫是 Docker Hub
    其他重要名詞:
    • 基礎映像 (base image)
      針對運行環境包裝的 image,不直接運行而是作為封裝 image 的基礎層使用。
    • Dockerfile
      指令文檔,用來撰寫封裝 image 的每個執行步驟。

:什麼東西,文鄒鄒的看不懂:(

沒關係,先從映像檔是什麼東西開始。


Image

要啟動一個包含服務的container,有幾件事情是必要的

  • 程式要執行在什麼環境上
  • 程式碼內容
  • 引用的套件
  • 執行需要的參數

image 就是定義了這些資訊的文件,Dockerfile 則是產生 image 的指令檔。
直接看 image 的組成比較好理解:
https://ithelp.ithome.com.tw/upload/images/20240903/20168437WkWN4M3DwD.png
docker image 是由多個 layers 組成的,每一層都是唯讀的文件,這些內容堆疊起來就是最終用來執行 container的映像檔。
大致可分為幾種組成:

  • 基礎層 (Base Layer)
    每個 Docker Image 都有一個基礎層,通常是某個操作系統的最小安裝包(如 Ubuntu、Alpine 等)。這是其他所有層的基礎,提供了運行應用程式所需的基本環境。
  • 中間層 (Intermediate Layers)
    中間層是通過 Dockerfile 中的指令建置的,例如安裝 packages/libraries、配置環境變數、複製程式碼等。每次執行這些指令,Docker 都會創建一個新的層。
  • 頂層 (Top Layer)
    頂層是 Docker Image 的最終層,包含了最終的程式碼以及運行時需要的配置和依賴。

另外,Docker Image 也包含了 Metadata,包含 image 建立時間、EXPOSE PORT 等資訊。

這樣多層次的建構方式,使得 Docker image 可以輕易的支援版本控制,一旦發生錯誤,可以立刻回復到先前的版本,不但正確還不用花費多餘的時間和人力。

Docker image 還有幾個重要的特性:

  • 底層共用
    在建立 docker image 時,每一層都是基於前一層進行增量修改,這使得不同的映像可以共享相同的基礎層,從而節省存儲空間。如:一個 base image 可以被多個不同的應用映像共享使用。
  • Container Layer (Writable Layer)
    當使用一個 docker image 啟動一個container時,Docker 會在這個 image 的頂部添加一個可寫層(Writable Layer),這個可寫層允許container在運行時對文件系統進行修改,如新增、刪除或更改文件,讓所有變更都存在 container 中,不會影響到原本的 image。
  • Copy-on-Write
    Copy-on-Write 是一種優化技術,是指當container需要修改某一只讀層中的文件時,才將文件複製到可寫層中。
    • 讀取:當container需要讀取文件時,直接從 Read Only 層中讀取內容
    • 文件修改
      • container需要修改Read Only 層中的文件時,Docker 會先將該文件複製到可寫層。
      • 修改可寫層中的副本,保持Read Only 層不變。
    • 新增文件:任何在container中新增的文件都會直接寫入到可寫層中

畫重點

layers:使 image 能輕鬆支援版本控制,且越底層的 image 越能互相共用。
Container Layer:保護了原始的 image 不會被修改,維持其一致性。
Copy-on-Write:大幅度地提高了資源利用效率,也減少了存儲空間的浪費。


Docker 的運行架構

前一篇有介紹過容器化的架構圖,有印象的話,這就是 Docker 執行起來的樣子:
https://ithelp.ithome.com.tw/upload/images/20240903/20168437AJWTaHkAQS.png
最下方是硬體層,提供應用程式所需的資源。
往上一層是 Host OS,基本上都會是 Linux。
再往上則是負責分配資源並運行 containercontainer engine:Docker,
最上一層就是包含應用程式和 Runtime,實際運作服務 Container 啦!

Docker 的優勢

其實 Docker 的優點在容器化就差不多說完了,這邊就做個簡單整理:

  1. 一致性:避免了「可是我本機可以跑啊~~~」的問題。
  2. 可移植性:能裝 Docker 的機器都能跑。
  3. 資源效率:與傳統虛擬機器相比,container 啟動更快,資源使用更少。
  4. 快速部署:只要產出一次映像檔就可以像蓋印章一樣到處用,並且保證部署的一致性和可靠性。
  5. 版本控制:上版之後壞了可以立刻改回去。

Docker 的應用場景

  1. 微服務架構
    在微服務架構中,應用程式被拆分為多個獨立的服務。每個服務都可以打包成一個container,獨立開發、測試和部署,從而提高靈活性和可伸縮性。
  2. CI/CD (持續整合/持續部署):
    可與 CI/CD 工具整合,使得應用程式在開發、測試和部署過程中的自動化變得更加容易。
  3. 雲計算
    Docker Container 可以輕鬆地在不同的雲端平台(如 AWS、Azure、Google Cloud)之間遷移,實現雲端資源的高效利用和靈活部署。

題外話:
Docker 是容器化技術的先驅嗎?
其實容器化技術的概念和雛形在 1970s 就已經出現囉,但是 Docker 將容器的管理封裝得更簡單更標準化,促使相關技術有了革命性的進展。
image 一定要使用 Docker 產生嗎?
不一定喔!
其實還有很多工具可以使用,像是:Podman、Buildah 也都可以建立符合 OCI 的 image。

小結

這一篇著重在介紹 Docker 的核心元素,這些元素使 Docker 實現了讓應用程式的開發和部署變得更加簡單、快速的方法。然而,隨著應用程式規模和複雜度的增加,僅僅依賴 Docker 已經不能夠滿足運營需求了。於是,像 Kubernetes 這樣以管理容器為核心的系統,開始逐漸體現它的價值。


延伸閱讀:
如果對 Docker 發展有興趣,可以參考網管人的這篇文章:輕量虛擬化改寫IT歷史 Docker容器技術細說從頭


上一篇
Day-1 在學習 Kubernetes 之前 - 容器化
下一篇
Day-3 在學習 Kubernetes 之前 - Docker(2)
系列文
Kubernetes圖解筆記6
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言